//

//

//

//

//

//

//

//

//

//

//

//

$base-font-size: 16px !default;

@function px($input) {
	@return to-unit(px, $input);
}
@function pt($input) {
	@return to-unit(pt, $input);
}
@function pc($input) {
	@return to-unit(pc, $input);
}
@function in($input) {
	@return to-unit(in, $input);
}
@function mm($input) {
	@return to-unit(mm, $input);
}
@function cm($input) {
	@return to-unit(cm, $input);
}
@function q($input) {
	@return to-unit(q, $input);
}

@function deg($input) {
	@return to-unit(deg, $input);
}
@function rad($input) {
	@return to-unit(rad, $input);
}
@function grad($input) {
	@return to-unit(grad, $input);
}
@function turn($input) {
	@return to-unit(turn, $input);
}

@function dpi($input) {
	@return to-unit(dpi, $input);
}
@function dpcm($input) {
	@return to-unit(dpcm, $input);
}
@function dppx($input) {
	@return to-unit(dppx, $input);
}

@function ms($input) {
	@return to-unit(ms, $input);
}
@function s($input) {
	@return to-unit(s, $input);
}

@function hz($input) {
	@return to-unit(hz, $input);
}
@function khz($input) {
	@return to-unit(khz, $input);
}

@function em($input...) {
	$em: to-unit(em, nth($input, 1));

	@if length($input) > 1 {
		@for $i from 2 through length($input) {
			$em: $em / num(em(nth($input, $i)));
		}
	}
	@return $em;
}
@function rem($input) {
	@return to-unit(rem, num(em($input)));
}

@function ex($input) {
	@return to-unit(ex, $input);
}
@function ch($input) {
	@return to-unit(ch, $input);
}

@function vw($input) {
	@return to-unit(vw, $input);
}
@function vh($input) {
	@return to-unit(vh, $input);
}
@function vmin($input) {
	@return to-unit(vmin, $input);
}
@function vmax($input) {
	@return to-unit(vmax, $input);
}

@function str($input) {
	@return #{$input};
}
@function num($input) {
	@if type-of($input) != number {
		@error 'Could not convert `#{$input}` - must be `type-of number`';
		@return null;
	}
	@return $input/($input * 0+1);
}
@function int($input) {
	$num: num($input);
	@return if($num<0, ceil($num), floor($num));
}
@function uint($input) {
	@return abs(int($input));
}

@function string($input) {
	@return str($input);
}
@function number($input) {
	@return num($input);
}

@function to-unit($unit, $input) {
	$to-unit: map-get(
		(
			px: 0px,
			pt: 0pt,
			pc: 0pc,
			in: 0in,
			mm: 0mm,
			cm: 0cm,
			q: 0Q,

			em: 0em,
			rem: 0rem,
			ch: 0ch,
			ex: 0ex,

			vw: 0vw,
			vh: 0vh,
			vmin: 0vmin,
			vmax: 0vmax,

			deg: 0deg,
			turn: 0turn,
			grad: 0grad,
			rad: 0rad,

			s: 0s,
			ms: 0ms,

			hz: 0Hz,
			khz: 0kHz,

			dpi: 0dpi,
			dpcm: 0dpcm,
			dppx: 0dppx,

			pct: 0%,
			percent: 0%,
			num: 0,
			number: 0,
		),
		$unit
	);

	@if not $to-unit {
		@error 'Could not convert to `#{$unit}` – must be a valid CSS unit';
		@return null;
	}

	@if index(num number ex ch vw vh vmin vmax, $unit) {
		$value: num($input);
	}

	@if index(em rem, unit($input)) {
		$input: 0px + num($input) * $base-font-size/1px;
	}
	@if index(em rem, $unit) and not unitless($input) {
		$input: 0px + $input;
		$input: num($input) * 1px / $base-font-size;
	}

	@if index(dpi dpcm dppx, $unit) {
		$units: (
			dppx: 0dppx,
			dpcm: 0dpcm,
			dpi: 0dpi,
		);
		$input-unit: map-get($units, unit($input));
		$input: if(1dppx < 95dpi, num($input-unit + (num($input) + $to-unit)), $input);
	}

	@return $to-unit + $input;
}

@function ratio($x, $y: null) {
	@if not $y {
		$n: $x;
		$y: 1;
		@while $y < 10 {
			$x: $n * 10 - ((10 - $y) * $n);
			@if $x == round($x) {
				@return #{$x}/#{$y};
			} @else {
				$y: $y + 1;
			}
		}
		$x: round($n * 1000000);
		$y: 1000000;
		@while $x % 10 == 0 {
			$x: $x/10;
			$y: $y/10;
		}
		@while $x % 5 == 0 {
			$x: $x/5;
			$y: $y/5;
		}
		@while $x % 2 == 0 {
			$x: $x/2;
			$y: $y/2;
		}
		@return #{$x}/#{$y};
	} @else if $x == round($x) and $y == round($y) {
		@return #{$x}/#{$y};
	}
	@warn 'X and Y must be integers';
	@return false;
}
